package com.jswitch.server.transaction;

import com.jswitch.common.enums.TransactionStateEnum;
import com.jswitch.sip.SipDialog;
import com.jswitch.sip.SipRequest;
import com.jswitch.sip.SipResponse;

import java.io.Serializable;

/**
 * 事务
 *
 * @author danmo
 * @version 1.0
 * @since 2024-06-10
 */
public interface Transaction extends Serializable {

    /**
     * 获取事务的唯一标识符。
     *
     * @return 事务的唯一ID。
     */
    String getTransactionId();

    /**
     * 开始处理事务。
     */
    void start();

    /**
     * 终止事务。
     */
    void terminate();

    /**
     * 取消事务。
     */
    void cancel();

    /**
     * 标记事务为已超时。
     */
    void timeout();

    /**
     * 获取当前事务的状态。
     *
     * @return 事务的当前状态。
     */
    TransactionStateEnum getState();

    /**
     * 处理收到的SIP请求。
     *
     * @param request SIP请求。
     */
    void processRequest(SipRequest request);

    /**
     * 处理收到的SIP响应。
     *
     * @param response SIP响应。
     */
    void processResponse(SipResponse response);

    /**
     * 返回与该事务关联的 SIP 对话框（如果有）。
     *
     * @return 与事务关联的 SIP 对话框，如果没有关联则返回 null。
     */
    SipDialog getDialog();

    /**
     * 检查事务是否与给定请求匹配。
     *
     * @param request SIP请求。
     * @return 如果事务匹配请求则返回true，否则返回false。
     */
    boolean matches(SipRequest request);
}
